﻿/*
LICENCE___________________________________________________________________
    Copyright (C) 2012 Reverdy Sylvain

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License along
    with this program; if not, write to the Free Software Foundation, Inc.,
    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
FIN LICENCE______________________________________________________________
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Windows.Controls;
using Merise_designer.Objets;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Xml.Linq;
using System.Xml;
using System.Data;
using System.Windows.Documents;
using System.IO;


namespace Merise_designer.Methodes
{
    public class ObjetsCommun
    {

        #region Attributs
        public Tuple<Entites, Lignes, Associations> m_objets{get;set;}
        private MainWindow mainWindow;
        private M_Types mTypes = new M_Types();
        public M_Types getContructorType()
        {
            return this.mTypes;
        }
        private M_DictionnaireDeDonnees mDico = new M_DictionnaireDeDonnees();
        public M_DictionnaireDeDonnees getContructorDico()
        {
            return this.mDico;
        }
        public Backup backup;
        
        private Grid grille;
        private System.Windows.Controls.Primitives.StatusBarItem statusBar;
        private Donnees.CadTools objDivers = new Donnees.CadTools();
        public Donnees.CL_Workspace workspace = new Donnees.CL_Workspace();

        #endregion

        #region Construction
        public ObjetsCommun(MainWindow mainWindow, Grid grille, System.Windows.Controls.Primitives.StatusBarItem statusBar)
        {
            this.mainWindow = mainWindow;
            this.grille = grille;
            this.statusBar = statusBar;
            m_objets = new Tuple<Entites, Lignes, Associations>(new Entites(this, grille), new Lignes(this, grille), new Associations(this, grille));
        }
        #endregion

        #region Entites
        public void AddEntite(Point position)
        {
            this.m_objets.Item1.Add(grille, position);
            Openroject.isSaved = false;
        }
        public CL_Entite getEntite(string name)
        {
            return this.m_objets.Item1.getEntite(name);
        }
        public void afficheContenuEntite(string monJeu)
        {
            this.m_objets.Item1.afficheContenu(monJeu);
        }
        public void updateEntite(CL_Entite entite)
        {
            Openroject.isSaved = false;
            this.m_objets.Item1.saveUpdate(entite.Id, false);
        }
        /// <summary>
        /// Créé une association à la place de l'entité en transférant aussi le dictionnaire de données
        /// </summary>
        /// <param name="entite"></param>
        public void convertToAssociation(CL_Entite entite)
        {

            //Récupère les associations connectées
            List<CL_Association> assoConnected = new List<CL_Association>();
            foreach (CL_Line l in m_objets.Item2.getAllLines())
            {
                if (l.IsConnectedToEntite(entite))
                {
                    assoConnected.Add(this.getAssociation(l.IdAssociation));
                }
            }

            //Créé l'association remplacante et la mémorise
            this.AddAssociation(Tools.SnapPointToGrid(new Point(entite.posLeft, entite.posTop), Configuration.stepGrid));
            CL_Association newAsso = m_objets.Item3.getLastAssociation();
            newAsso.Name = entite.Name;
            newAsso.Largeur = entite.Largeur;
            newAsso.Hauteur = entite.Hauteur;

            //copie les données du dictionnaire de l'ancienne entité vers la nouvelle asso.
            List<CL_DictionnaireDeDonnees> donnees = mDico.selectAllFromEntite(entite, "monJeu");
            foreach (CL_DictionnaireDeDonnees d in donnees)
            {
                d.idEntite = "";
                d.idAsso = newAsso.Id;
            }

            //copie les données du dictionnaire des anciennes asso périphériques vers la nouvelle asso
            foreach (CL_Association a in assoConnected)
            {
                List<CL_DictionnaireDeDonnees> donneesPeriph = mDico.selectAllFromAssociation(a, "monJeu");
                foreach (CL_DictionnaireDeDonnees d in donneesPeriph)
                {
                    d.idAsso = newAsso.Id;
                }

            }

            //Détruit les associations connectées et reconnecte la ligne résiduelle à l'asso
            List<CL_Entite> bounderEntitys = new List<CL_Entite>();
            List<String> cardinalites = new List<string>();
            foreach (CL_Association a in assoConnected)
            {

                //Récupère l'entité connectée de l'autre côté de la ligne
                foreach (CL_Line l in m_objets.Item2.getAllLines())
                {
                    if (l.IsConnectedToAssociation(a))
                    {
                        bounderEntitys.Add(this.getEntite(l.IdEntite));
                        cardinalites.Add(l.Cardinalite);
                    }
                }
                m_objets.Item3.lostFocus(grille, a.Id);
                this.Del(a.Id);
            }

            //Créé les lignes
            for (int i = 0; i < bounderEntitys.Count; i++)
            {
                this.AddLigne(bounderEntitys[i], newAsso);
                m_objets.Item2.getLast().Cardinalite = cardinalites[i];
            }

            //supprime l'entite
            m_objets.Item1.lostFocus(grille, entite.Id);
            this.Del(entite.Id);

            //Supprime les lignes en double
            m_objets.Item2.cleanDoublons();

            this.updateMode();
            CreateBackUpFIle(); //Pour les opérations Annuler/Rétablir

        }

        #endregion

        #region Lignes
        public void AddLigne(CL_Entite ent, CL_Association asso)
        {
            this.m_objets.Item2.Add(grille, ent, asso);
            Openroject.isSaved = false;
        }
        public void DelLine(CL_Line line)
        {
            this.m_objets.Item2.Del(grille, line);
        }
        public bool IsLineOf(CL_Entite ent, CL_Association asso)
        {
            return this.m_objets.Item2.isLineOf(ent, asso);
        }
        #endregion

        #region Associations
        public void AddAssociation(Point position)
        {
            Openroject.isSaved = false;
            this.m_objets.Item3.Add(grille, position);
        }
        public CL_Association getAssociation(string name)
        {
            return this.m_objets.Item3.getAssociation(name);
        }
        public CL_Association getLastAssociation()
        {
            return this.m_objets.Item3.getLastAssociation();
        }
        public void afficheContenuAsso(string monJeu)
        {
            this.m_objets.Item3.afficheContenu(monJeu);
        }
        public void updateAsso(CL_Association asso)
        {
            Openroject.isSaved = false;
            this.m_objets.Item3.saveUpdate(asso.Id, false);
        }
        /// <summary>
        /// Créé une entité à la place de l'association en transférant aussi le dictionnaire de données
        /// </summary>
        /// <param name="asso"></param>
        public void convertToEntity(CL_Association asso)
        {

            //Récupère les entité connectées
            List<CL_Entite> entiteConnected = new List<CL_Entite>();
            List<String> cardinalites = new List<string>();
            foreach (CL_Line l in m_objets.Item2.getAllLines())
            {
                if (l.IsConnectedToAssociation(asso))
                {
                    entiteConnected.Add(this.getEntite(l.IdEntite));
                    cardinalites.Add(l.Cardinalite);
                }
            }

            //Créé l'entité remplacante et la mémorise
            this.AddEntite(Tools.SnapPointToGrid(new Point(asso.posLeft, asso.posTop), Configuration.stepGrid));
            CL_Entite newEntity = m_objets.Item1.getLast();
            newEntity.Name = asso.Name;
            newEntity.Hauteur = asso.Hauteur;
            newEntity.Largeur = asso.Largeur;

            //copie les données du dictionnaire
            List<CL_DictionnaireDeDonnees> donnees = mDico.selectAllFromAssociation(asso, "monJeu");
            foreach (CL_DictionnaireDeDonnees d in donnees)
            {
                d.idAsso = "";
                d.idEntite = newEntity.Id;
            }


            //Créé n associations vierges entre l'entité et les entité connectées
            Point ptMiddle = new Point();
            for (int i = 0; i < entiteConnected.Count; i++)
            {
                //calcule le point central d'insertion
                ptMiddle.X = (newEntity.posLeft + entiteConnected[i].posLeft) / 2;
                ptMiddle.Y = (newEntity.posTop + entiteConnected[i].posTop) / 2;
                ptMiddle = Tools.SnapPointToGrid(ptMiddle, Configuration.stepGrid);
                //Ajoute l'association au point milieu
                this.AddAssociation(ptMiddle);
                CL_Association lastAsso = m_objets.Item3.getLastAssociation();

                //créé les lignes
                this.AddLigne(entiteConnected[i], lastAsso);
                m_objets.Item2.getLast().Cardinalite = cardinalites[i];
                this.AddLigne(newEntity, lastAsso);
            }

            //supprimer l'association
            m_objets.Item3.lostFocus(grille, asso.Id);
            this.Del(asso.Id);
            this.updateMode();
            CreateBackUpFIle(); //Pour les opérations Annuler/Rétablir
        }
        #endregion

        #region CommonOnjet
        public int idObjet(string name)
        {
            if (this.m_objets.Item1.id(name) != -1)
            {
                return this.m_objets.Item1.id(name);
            }
            else if (this.m_objets.Item3.id(name) != -1)
            {
                return this.m_objets.Item3.id(name);
            }
            return -1;
        }
        public void getFocus(string name)
        {
            if (this.m_objets.Item1.id(name) != -1)
            {
                this.m_objets.Item1.getFocus(grille, name);
            }
            else if (this.m_objets.Item3.id(name) != -1)
            {
                this.m_objets.Item3.getFocus(grille, name);
            }
        }
        public void lostFocus(string name)
        {
            if (this.m_objets.Item1.id(name) != -1)
            {
                this.m_objets.Item1.lostFocus(grille, name);
            }
            else if (this.m_objets.Item3.id(name) != -1)
            {
                this.m_objets.Item3.lostFocus(grille, name);
            }
        }
        public double posLeft(string name)
        {
            if (this.m_objets.Item1.id(name) != -1)
            {
                return this.m_objets.Item1.posLeft(name);
            }
            else if (this.m_objets.Item3.id(name) != -1)
            {
                return this.m_objets.Item3.posLeft(name);
            }
            return -1;
        }
        public double posTop(string name)
        {
            if (this.m_objets.Item1.id(name) != -1)
            {
                return this.m_objets.Item1.posTop(name);
            }
            else if (this.m_objets.Item3.id(name) != -1)
            {
                return this.m_objets.Item3.posTop(name);
            }
            return -1;

        }
        public void move(string name, Point from, Point to)
        {
            if (this.m_objets.Item1.id(name) != -1)
            {
                Openroject.isSaved = false;
                this.m_objets.Item1.move(name, from, to);
                this.m_objets.Item2.move(this.m_objets.Item1.getEntite(name), null);
            }
            else if (this.m_objets.Item3.id(name) != -1)
            {
                Openroject.isSaved = false;
                this.m_objets.Item3.move(name, from, to);
                this.m_objets.Item2.move(null, this.m_objets.Item3.getAssociation(name));
            }
        }
        public void Del(string name)
        {
            if (this.m_objets.Item1.id(name) != -1)
            {
                Openroject.isSaved = false;
                this.m_objets.Item2.Del(grille, this.m_objets.Item1.getEntite(name), null);
                this.m_objets.Item1.Del(grille, name);
            }
            else if (this.m_objets.Item3.id(name) != -1)
            {
                Openroject.isSaved = false;
                this.m_objets.Item2.Del(grille, null, this.m_objets.Item3.getAssociation(name));
                this.m_objets.Item3.Del(grille, name);
            }
        }
        public void edit(string name)
        {
            if (this.m_objets.Item1.id(name) != -1)
            {
                Openroject.isSaved = false;
                this.m_objets.Item1.edit(name);
            }
            else if (this.m_objets.Item3.id(name) != -1)
            {
                Openroject.isSaved = false;
                this.m_objets.Item3.edit(name);
            }
        }
        /// <summary>
        /// retourne 0 si c'est une Entité et 1 si Association (-1 si non trouvé)
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public int getTypeOfControl(string name)
        {
            if (this.m_objets.Item1.id(name) != -1)
            {
                return 0;
            }
            else if (this.m_objets.Item3.id(name) != -1)
            {
                return 1;
            }
            return -1;
        }
        public void movePoignee(string nameObj, Point newCursor)
        {
            if (this.m_objets.Item1.id(nameObj) != -1)
            {
                this.m_objets.Item1.movePoignees(nameObj, newCursor);
                this.m_objets.Item2.move(this.m_objets.Item1.getEntite(nameObj), null);
            }
            else if (this.m_objets.Item3.id(nameObj) != -1)
            {
                this.m_objets.Item3.movePoignees(nameObj, newCursor);
                this.m_objets.Item2.move(null, this.m_objets.Item3.getAssociation(nameObj));
            }
        }
        public int getIDpoignee(string nameObj, Point cursor)
        {
            if (this.m_objets.Item1.id(nameObj) != -1)
            {
                return this.m_objets.Item1.getIDpoignee(nameObj, cursor);
            }
            else if (this.m_objets.Item3.id(nameObj) != -1)
            {
                return this.m_objets.Item3.getIDpoignee(nameObj, cursor);
            }
            return -1;
        }
        public void saveUpdate(string name)
        {
            if (this.m_objets.Item1.id(name) != -1)
            {
                Openroject.isSaved = false;
                this.m_objets.Item1.saveUpdate(name, false);
                this.m_objets.Item2.saveUpdate(this.m_objets.Item1.getEntite(name), null, false);
            }
            else if (this.m_objets.Item3.id(name) != -1)
            {
                Openroject.isSaved = false;
                this.m_objets.Item3.saveUpdate(name, false);
                this.m_objets.Item2.saveUpdate(null, this.m_objets.Item3.getAssociation(name), false);
            }
        }
        public List<Control> selectAll()
        {
            List<Control> results = new List<Control>();

            foreach (CL_Entite e in m_objets.Item1.getAllEntites())
            {
                e.lostFocus(grille);
                e.getFocus(grille);
                foreach (Control c in grille.Children.OfType<Control>())
                {
                    if (c.Name == e.Name) results.Add(c);
                }
            }
            foreach (CL_Association a in m_objets.Item3.getAllAssociations())
            {
                a.lostFocus(grille);
                a.getFocus(grille);
                foreach (Control c in grille.Children.OfType<Control>())
                {
                    if (c.Name == a.Name) results.Add(c);
                }
            }
            return results;
        }
        public void writeAll()
        {
            foreach (CL_Entite e in m_objets.Item1.getAllEntites())
            {
                Console.WriteLine(e.Id+"-x:" + e.posLeft + "-y:" + e.posTop+";");
            }
            foreach (CL_Association a in m_objets.Item3.getAllAssociations())
            {
                Console.WriteLine(a.Id + "-x:" + a.posLeft + "-y:" + a.posTop + ";");
            }
        }


        //public void copyMiseEnforme(String srcName, String destName)
        //{
        //    if (this.m_objets.Item1.id(srcName) != -1)
        //    {
        //        CL_Entite src = this.m_objets.Item1.getEntite(srcName);
        //        if (this.m_objets.Item1.id(destName) != -1)
        //        {
        //            //Entite to entite
        //            copyMSETo(src, this.m_objets.Item1.getEntite(destName));
        //        }
        //        else if (this.m_objets.Item3.id(destName) != -1)
        //        {
        //            copyMSETo(src, this.m_objets.Item3.getAssociation(destName));
        //        }

        //    }
        //    else if (this.m_objets.Item3.id(srcName) != -1)
        //    {
        //        CL_Association src = this.m_objets.Item3.getAssociation(srcName);
        //        if (this.m_objets.Item1.id(destName) != -1)
        //        {
        //            //Asso to entite
        //            copyMSETo(src, this.m_objets.Item1.getEntite(destName));
        //        }
        //        else if (this.m_objets.Item3.id(destName) != -1)
        //        {
        //            copyMSETo(src, this.m_objets.Item3.getAssociation(destName));
        //        }
        //    }

        //}
        //private void copyMSETo(CL_Entite src, CL_Entite dest)
        //{
        //    dest.Hauteur = src.Hauteur;
        //    dest.Largeur = src.Largeur;
        //    dest.DelPoignees(grille);
        //    dest.addPoignees(grille, false);


        //}
        //private void copyMSETo(CL_Entite src, CL_Association dest)
        //{
        //    dest.Hauteur = src.Hauteur;
        //    dest.Largeur = src.Largeur;
        //    dest.setTitlePosition();
        //    dest.DelPoignees(grille);
        //    dest.addPoignees(grille, false);
        //    dest.setTitlePosition();

        //}
        //private void copyMSETo(CL_Association src, CL_Association dest)
        //{
        //    dest.Hauteur = src.Hauteur;
        //    dest.Largeur = src.Largeur;
        //    dest.setTitlePosition();
        //    dest.DelPoignees(grille);
        //    dest.addPoignees(grille,false);
        //    dest.setTitlePosition();

        //}
        //private void copyMSETo(CL_Association src, CL_Entite dest)
        //{
        //    dest.Hauteur = src.Hauteur;
        //    dest.Largeur = src.Largeur;
        //    dest.DelPoignees(grille);
        //    dest.addPoignees(grille, false);

        //}
        #endregion

        #region Chargement des données depuis la BDD
        public void LoadingBDD(Grid grille)
        {
            statusBar.Content = "Chargement en cours...";
            grille.Cursor = System.Windows.Input.Cursors.Wait;

            //initialise les ficiers de backup
            mainWindow.annuler.IsEnabled = backup.asBack() ? true : false;
            mainWindow.img_Back.Source = backup.asBack() ? new BitmapImage(new Uri("/Resources/back.png", UriKind.Relative)) : new BitmapImage(new Uri("/Resources/back_dis.png", UriKind.Relative));
            mainWindow.retablir.IsEnabled = backup.asNext() ? true : false;
            mainWindow.img_Next.Source = backup.asNext() ? new BitmapImage(new Uri("/Resources/next.png", UriKind.Relative)) : new BitmapImage(new Uri("/Resources/next_dis.png", UriKind.Relative));

            //Entites
            this.m_objets.Item1.load(grille);

            //Associations
            this.m_objets.Item3.load(grille);

            //Chargement des lignes
            this.m_objets.Item2.load(grille);

            mTypes.load();
            mDico.load();

            //Met à jour le compteur de numéros auto (Plus grand nombre de la base +1)
            CL_Variables.setPrefixNameAuto(this.objDivers.getLastNumeroAuto("monJeu"));

            this.updateMode();

            grille.Cursor = System.Windows.Input.Cursors.Arrow;
            statusBar.Content = "Choisissez une opération";
        }
        #endregion

        #region Efface toutes les données de la BDD
        public void EraseAll(Grid grille, Boolean resetIdAuto)
        {
            Openroject.isSaved = false;

            //TODO types
            String req = "";
            Donnees.CL_DictionnaireDeDonnees dicoData = new Donnees.CL_DictionnaireDeDonnees();
            req+=dicoData.getDeleteAll();

            Donnees.CL_Lignes ligneData = new Donnees.CL_Lignes();
            req+=ligneData.getDeleteAll();

            Donnees.CL_Entites EntiteData = new Donnees.CL_Entites();
            req+=EntiteData.getDeleteAll();

            Donnees.CL_Associations AssoData = new Donnees.CL_Associations();
            req+=AssoData.getDeleteAll();

            Merise_designer.Donnees.CL_CAD cad = new Merise_designer.Donnees.CL_CAD();
            cad.ActionsRowsTransact(req, false);

            if (resetIdAuto)
            {
                //initialise le compteur
                CL_Variables.initIDNameAuto();
            }

        }
        #endregion

        #region Initialise tous les Objects
        public void initAll(Grid grille)
        {

            m_objets = new Tuple<Entites, Lignes, Associations>(new Entites(this, grille), new Lignes(this, grille), new Associations(this, grille));
            mTypes = new M_Types();
            mDico = new M_DictionnaireDeDonnees();

            #region id des préfixes auto
            //initialise le compteur
            CL_Variables.initIDNameAuto();
            #endregion

        }
        #endregion

        #region initialise la BDD (Création)
        public Boolean prepareNewBDD()
        {
            //Supprime le fichier de BDD si il existe   
            if (File.Exists(Openroject.getInternalBDDFIle()))
            {
                File.Delete(Openroject.getInternalBDDFIle());
            }

            //Créé le fichier BDD généré
            Donnees.CadTools diversData = new Donnees.CadTools();
            return diversData.generateNewBDD(Openroject.getInternalBDDFIle(),"");
        }
        #endregion

        #region Sauvegarde dans la BDD
        public void SaveAllInDB(Grid grille)
        {
            grille.Cursor = System.Windows.Input.Cursors.Wait;
            statusBar.Content = "Sauvegarde en cours...";

            //Vide la BDD
            EraseAll(grille, false);

            String req = "";
            #region Préparation des requetes
            #region Entites
            Donnees.CL_Entites EntiteData = new Donnees.CL_Entites();
            foreach (CL_Entite ent in this.m_objets.Item1.getAllEntites())
            {
                req += EntiteData.getAdd(ent);
            }
            #endregion

            #region Associations
            Donnees.CL_Associations AssoData = new Donnees.CL_Associations();
            foreach (CL_Association ass in this.m_objets.Item3.getAllAssociations())
            {
                req += AssoData.getAdd(ass);
            }
            #endregion

            #region Lignes
            Donnees.CL_Lignes lineData = new Donnees.CL_Lignes();
            foreach (CL_Line line in this.m_objets.Item2.getAllLines())//récupère toutes les entités
            {
                req += lineData.getAdd(line);
            }
            #endregion

            #region Dictionnaire de données
            Donnees.CL_DictionnaireDeDonnees dicoData = new Donnees.CL_DictionnaireDeDonnees();
            foreach (CL_DictionnaireDeDonnees d in mDico.selectAll())
            {
                req += dicoData.getAdd(d);
            }
            #endregion

            //TODO types
            #endregion

            Merise_designer.Donnees.CL_CAD cad = new Merise_designer.Donnees.CL_CAD();
            cad.ActionsRowsTransact(req, false);

            Openroject.isSaved = true;
            grille.Cursor = System.Windows.Input.Cursors.Arrow;
            statusBar.Content = "Choisissez une opération";
        }
        #endregion

        #region BackUp
        public void CreateBackUpFIle()
        {

            grille.Cursor = System.Windows.Input.Cursors.Wait;
            statusBar.Content = "BackUp...";

            /**Préparation du fichier**/
            String _actualBddFile = Openroject.getActualProjectFIle();
            String backUpFile = this.backup.save();

            //Créé le fichier BDD généré automatiquement
            Donnees.CadTools diversData = new Donnees.CadTools();

            Openroject.setActualProjectFIle(backUpFile);
            Openroject.SetisCHanged(true);

            String req = "";
            #region Préparation des requetes
            #region Entites
            Donnees.CL_Entites EntiteData = new Donnees.CL_Entites();
            foreach (CL_Entite ent in this.m_objets.Item1.getAllEntites())
            {
                req += EntiteData.getAdd(ent);
            }
            #endregion

            #region Associations
            Donnees.CL_Associations AssoData = new Donnees.CL_Associations();
            foreach (CL_Association ass in this.m_objets.Item3.getAllAssociations())
            {
                req += AssoData.getAdd(ass);
            }
            #endregion

            #region Lignes
            Donnees.CL_Lignes lineData = new Donnees.CL_Lignes();
            foreach (CL_Line line in this.m_objets.Item2.getAllLines())//récupère toutes les entités
            {
                req += lineData.getAdd(line);
            }
            #endregion

            #region Dictionnaire de données
            Donnees.CL_DictionnaireDeDonnees dicoData = new Donnees.CL_DictionnaireDeDonnees();
            foreach (CL_DictionnaireDeDonnees d in mDico.selectAll())
            {
                req += dicoData.getAdd(d);
            }
            #endregion

            //TODO types
            #endregion

            if (!diversData.generateNewBDD(backUpFile,req))
            {
                retablishDefaultSettings(_actualBddFile);
                return;
            }

            retablishDefaultSettings(_actualBddFile);
        }
        public void back()
        {
            grille.Cursor = System.Windows.Input.Cursors.Wait;
            statusBar.Content = "Back Restore...";

            /**Préparation du fichier**/
            String _actualBddFile = Openroject.getActualProjectFIle();
            String backUpFile = this.backup.cancel();

            //Ouverture du fichier
            if (!mainWindow.OpenDocument(backUpFile, true))
            {
                retablishDefaultSettings(_actualBddFile);
                return;
            }
            retablishDefaultSettings(_actualBddFile);
        }
        public void next()
        {
            grille.Cursor = System.Windows.Input.Cursors.Wait;
            statusBar.Content = "Next Restore...";

            /**Préparation du fichier**/
            String _actualBddFile = Openroject.getActualProjectFIle();
            String backUpFile = this.backup.restore();

            //Ouverture du fichier
            if (!mainWindow.OpenDocument(backUpFile, true))
            {
                retablishDefaultSettings(_actualBddFile);
                return;
            }
            retablishDefaultSettings(_actualBddFile);
        }
        private void retablishDefaultSettings(String bddFile)
        {
            Openroject.SetisCHanged(true);
            Openroject.setActualProjectFIle(bddFile);
            grille.Cursor = System.Windows.Input.Cursors.Arrow;
            statusBar.Content = "Choisissez une opération";

            mainWindow.annuler.IsEnabled = backup.asBack() ? true : false;
            mainWindow.img_Back.Source = backup.asBack() ? new BitmapImage(new Uri("/Resources/back.png", UriKind.Relative)) : new BitmapImage(new Uri("/Resources/back_dis.png", UriKind.Relative));
            mainWindow.retablir.IsEnabled = backup.asNext() ? true : false;
            mainWindow.img_Next.Source = backup.asNext() ? new BitmapImage(new Uri("/Resources/next.png", UriKind.Relative)) : new BitmapImage(new Uri("/Resources/next_dis.png", UriKind.Relative));

        }
        public void reLoadBackUp()
        {
            if(backup!=null) backup.removeAll();
            backup=new Backup(Path.GetFileName(Openroject.getActualProjectFIle()));
            backup.removeAll();
            mainWindow.annuler.IsEnabled = backup.asBack() ? true : false;
            mainWindow.retablir.IsEnabled = backup.asNext() ? true : false;
            CreateBackUpFIle();
        }

        #endregion

        #region Impressions
        public void printToJPG(Grid scr, Boolean Screen)
        {
            if (Screen)
            {
                System.Windows.Controls.PrintDialog dialog = new System.Windows.Controls.PrintDialog();

                if (dialog.ShowDialog() == true)
                {
                    dialog.PrintVisual(scr, "Merise Designer");
                }
            }
            else
            {
                PrintDialog printDlg = new System.Windows.Controls.PrintDialog();
                if (printDlg.ShowDialog() == true)
                {

                    //get selected printer capabilities
                    System.Printing.PrintCapabilities capabilities = printDlg.PrintQueue.GetPrintCapabilities(printDlg.PrintTicket);

                    //get scale of the print wrt to screen of WPF visual
                    double scale = Math.Min(capabilities.PageImageableArea.ExtentWidth / scr.ActualWidth, capabilities.PageImageableArea.ExtentHeight /
                                   scr.ActualHeight);

                    //Transform the Visual to scale
                    Transform _holdTransform = scr.LayoutTransform;
                    scr.LayoutTransform = new ScaleTransform(scale, scale);

                    //get the size of the printer page
                    Size _holdSize = scr.DesiredSize;

                    Size sz = new Size(capabilities.PageImageableArea.ExtentWidth, capabilities.PageImageableArea.ExtentHeight);

                    //update the layout of the visual to the printer page size.
                    scr.Measure(sz);
                    scr.Arrange(new Rect(new Point(capabilities.PageImageableArea.OriginWidth, capabilities.PageImageableArea.OriginHeight), sz));

                    //now print the visual to printer to fit on the one page.
                    printDlg.PrintVisual(scr, "Merise Designer");

                    //rétablit la position
                    scr.LayoutTransform = _holdTransform;
                    scr.Measure(_holdSize);

                }
            }

        }

        #endregion

        #region MCD/MLD
        public void changeMode()
        {
            if (Mode.mode == Mode.MODE_MCD)
            {
                Mode.mode = Mode.MODE_MLD;
            }
            else
            {
                Mode.mode = Mode.MODE_MCD;
            }
            updateMode();
        }
        public void updateMode()
        {
            if (Mode.mode == Mode.MODE_MLD)
            {
                //MODE MLD
                this.m_objets.Item1.afficheContenuMLD("monJeu", m_objets);
                this.m_objets.Item3.afficheContenuMLD("monJeu", m_objets);
            }
            else
            {
                //MODE MCD
                this.m_objets.Item3.afficheContenu("monJeu");
                this.m_objets.Item1.afficheContenu("monJeu");
            }
            //Changement des associations
            this.m_objets.Item3.switchMode();
        }
        #endregion


    }
}
